package com.ikun.core.utils;

import org.springframework.context.EnvironmentAware;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;

/**
 * YAML配置文件工具类
 * 用于读取application.yml等配置文件中的属性值
 */
@Component
public class YmlUtils implements EnvironmentAware {

    private static Environment env;

    /**
     * 设置环境变量
     *
     * @param environment 环境变量
     */
    @Override
    public void setEnvironment(Environment environment) {
        YmlUtils.env = environment;
    }

    /**
     * 根据Key获取值
     *
     * @param key 键 eg: spring.datasource.url
     * @return 属性值，如果不存在返回null
     */
    public static String get(String key) {
        return env != null ? env.getProperty(key) : null;
    }

    /**
     * 根据Key获取值，支持默认值
     *
     * @param key          键
     * @param defaultValue 默认值
     * @return 属性值，如果不存在返回默认值
     */
    public static String get(String key, String defaultValue) {
        return env != null ? env.getProperty(key, defaultValue) : defaultValue;
    }

    /**
     * 从配置文件中读取指定 key 的值，并自动转换成你指定的目标类型 T
     *
     * <p>示例用法：
     * <pre>{@code
     * // 从配置文件中读取 server.port 并转换为 Integer 类型
     * Integer port = YmlUtils.get("server.port", Integer.class);
     * }</pre>
     * </p>
     *
     * @param key        键
     * @param targetType 目标类型
     * @param <T>        泛型
     * @return 属性值
     */
    public static <T> T get(String key, Class<T> targetType) {
        return env != null ? env.getProperty(key, targetType) : null;
    }


    /**
     * 根据Key获取指定类型的值，支持默认值
     *
     * @param key          键
     * @param targetType   目标类型
     * @param defaultValue 默认值
     * @param <T>          泛型
     * @return 属性值
     */
    public static <T> T get(String key, Class<T> targetType, T defaultValue) {
        return env != null ? env.getProperty(key, targetType, defaultValue) : defaultValue;
    }

    /**
     * 检查属性是否存在
     *
     * @param key 键
     * @return 是否存在
     */
    public static boolean containsProperty(String key) {
        return env != null && env.containsProperty(key);
    }

    /**
     * 获取必需的属性值，如果不存在（null 或者 ""）则抛出异常
     *
     * @param key 键
     * @return 属性值
     * @throws IllegalStateException 如果属性不存在
     */
    public static String getRequiredProperty(String key) {
        if (env == null) {
            throw new IllegalStateException("Environment is not initialized");
        }
        // 当 key 不存在时，getRequiredProperty 会抛出 IllegalStateException 异常
        // getRequiredProperty 只检查 key 是否存在，不检查值是否为空字符串（配置文件中只定义字段不设置值，值默认就是空字符串）
        String value = env.getRequiredProperty(key);
        if (value.trim().isEmpty()) {
            throw new IllegalStateException(key + "不能为空字符串");
        }
        return value;

    }

    /**
     * 从配置文件中读取指定 key 的值，并自动转换成你指定的目标类型 T，如果找不到该 key，则抛出异常。
     *
     * @param key        键
     * @param targetType 目标类型
     * @param <T>        泛型
     * @return 属性值
     * @throws IllegalStateException 如果属性不存在
     */
    public static <T> T getRequiredProperty(String key, Class<T> targetType) {
        if (env == null) {
            throw new IllegalStateException("Environment is not initialized");
        }
        return env.getRequiredProperty(key, targetType);
    }
}


